/***************************************************************************
 创建者: 华磊
 开始时间: 2018.4.14
 copyright: (C) 华友高科
 修改说明: (每次有修改就添加一条，带有 修改人，修改时间，修改描述)
 example (1) hualei 2017.5.29 类的具体实现代码编写

 ***************************************************************************
 *  @file rfidsensor.h
 *  功能: RFID读卡器的设置和数据获取
 *
 *                                                                         *
 ***************************************************************************/
#ifndef RFIDSENSOR_H
#define RFIDSENSOR_H
#include <qstring.h>
#include <QtSerialPort/qserialport.h>
#include <QtSerialPort/qserialportinfo.h>
#include <QString>
#include "modbus.h"
#include <QMap>
#include <QMutex>
#include <QTimer>

#define D_IF_DEBUG                            (1)       //qDebug调试开关
#define D_RFID_MODE_REGISTER                  (0x00)    //RFID读卡器模式寄存器
#define D_RFID_READ_TAG_REGISTER              (0x0E)    //RFID读卡器读卡数据寄存器
#define D_RFID_INFO_REGISTER                  (0x01)    //RFID读卡器版本信息寄存器
#define D_RFID_TAG_REGISTERS_NUMBER           (0x07)    //RFID读卡器读卡数据寄存器数量

#define D_RFID_MODE_MASTER_SLAVE_VALUE        (0x02)    //RFID读卡器主从模式数值
#define D_RFID_MODE_SLAVE_INITIATIVE_VALUE    (0x03)    //RFID读卡器从机主动发送模式数值


/**
 * @brief The RFID_SerialPortInfo struct        RFID 传感器窗口配置
 */
struct RFID_SerialPortInfo
{
    /**
     * @brief ModbusType        Modbus总线类型
     */
    int ModbusType;

    /**
     * @brief serialDeviceName  串口设备文件名
     */
    QString serialDeviceName;

    /**
     * @brief baudRate          波特率
     */
    int baudRate;
    /**
     * @brief dataBits          数据位
     */
    int dataBits;
    /**
     * @brief parity            校验位
     */
    QString parity;
    /**
     * @brief stopBits          停止位
     */
    int stopBits;
    /**
     * @brief updatePeriod      更新周期
     */
    int updatePeriod;
};

/**
 * @brief The E_MODBUS_TYPE_RFID enum   MODBUS总线类型
 */
enum E_MODBUS_TYPE_RFID
{
    E_MODBUS_TYPE_RTU_RFID=1,       // RTU
    E_MODBUS_TYPE_TCP_RFID=2        // TCP
};

/**
 * @brief The E_VENDOR_ID_RFID enum     设备厂商ID
 */
enum E_VENDOR_ID_RFID
{
    E_VENDOR_ID_JIAN_YONG = 1,          // 健永科技

};

/**
 * @brief The RFID_DeviceNode struct      磁传感器设备节点
 */
struct RFID_DeviceNode
{
    /**
     * @brief deviceVendorId        设备厂商ID
     */
    int deviceVendorId;

    /**
     * @brief deviceId              设备ID
     */
    int deviceId;
};

/**
 * @brief The RFID_CardData struct      RFID标签卡数据
 */
struct RFID_CardData
{
    /**
     * @brief cardData      RFID标签数据
     */
    QString cardData;
    /**
     * @brief readCardTime  读卡时间
     */
    double readCardTime;
};
/**
 * @brief The RfidSensor class
 */

/**
 * @brief The RfidSensor class          RFID传感器读取标签类
 */
class RfidSensor:public QObject
{
    Q_OBJECT
public:
    /**
     * @brief RfidSensor                构造函数
     * @param configFileName            RFID传感器配置文件名
     */
    RfidSensor(QString configFileName);
    /**
     * @brief isReadRfidInfo    配置文件初始化状态
     * @return      success:true  failed:false
     */
    bool isReadRfidInfo();

    /**
     * @brief getCurrentTagData  获取读卡数据接口
     * @param deviceId           RFID读卡器设备地址
     * @param valueOut           RFID卡内数据
     * @param readCardTime       当前数据的读卡时间
     * @return    success: 1  failed: -1  (卡片未在读取范围内: return-0, valueOut=0)
     */
    int getCurrentTagData(int deviceId, QString &valueOut,double &readCardTime);

    /**
     * @brief checkModbusMaster 检查主机设备
     * @return 　success:1  failed:-1
     */
    int checkModbusMaster();

    /**
     * @brief CRC_MB_RFID   RFID读卡器数据帧CRC计算接口
     * @param cBuffer       数据缓冲区
     * @param iBuflen       缓冲区长度
     * @return              CRC校验数值
     */
    unsigned int CRC_MB_RFID(unsigned char *cBuffer, unsigned int iBuflen);
private:
    /**
     * @brief readRfidInfo  读取配置文件
     * @param infoReturn　　配置文件路径
     * @return  success:1  failed: <0
     */
    int readRfidInfo(QString &infoReturn);

    /**
     * @brief connectPort   MODBUS_RTU_RS485串口连接
     * @return              success:1  failed: -1
     */
    int connectPort();

    /**
     * @brief readTagVendorId  设备ID为１时，读卡数据处理
     * @return                 success:1  failed:-1
     */
    int readTagVendorId();

    /**
     * @brief readTag 开始读取卡片
     * @return 　success:1  failed:-1
     */
    int readTag();
private slots:
    /**
     * @brief timeOut_slot      定时器响应槽函数
     */
    void timeOut_slot();

private:

    /**
     * @brief isReadRfidInfoOk          配置文件讀取狀態
     */
    bool isReadRfidInfoOk;

    /**
     * @brief isSerialPortConnectOk     串口连接状态
     */
    bool isSerialPortConnectOk;

    /**
     * @brief rfid_DeviceMap         RFID设备节点对象
     */
    QMap<int, RFID_DeviceNode> rfid_DeviceMap;

    /**
     * @brief it                     RFID设备节点迭代器对象
     */
    QMap<int, RFID_DeviceNode>::iterator it;

    /**
     * @brief rfid_ReadTagMap        读取到的RFID卡数据容器
     */
    QMap<int, RFID_CardData> rfid_ReadTagMap;

    /**
     * @brief rfidFormerDeviceId      原RFID设备ID
     */
    int rfidFormerDeviceId;

    /**
     * @brief rfidSerialPortInfo       串口配置对象
     */
    RFID_SerialPortInfo *rfidSerialPortInfo;

    /**
     * @brief modbusMaster              Modbus主机对象
     */
    modbus_t *modbusMaster;

    /**
     * @brief mutex                     mutex锁
     */
    QMutex mutex;

    /**
     * @brief timer                     定时器
     */
    QTimer timer;
};

#endif // RFIDSENSOR_H
